টাইপস্ক্রিপ্ট ডিসক্রিমিনেটেড ইউনিয়নস ব্যবহার করে শক্তিশালী ও টাইপ-সেফ স্টেট মেশিন তৈরি করুন। স্টেট ডিফাইন, ট্রানজিশন হ্যান্ডেল এবং কোডের নির্ভরযোগ্যতা বাড়াতে এর ব্যবহার শিখুন।
টাইপস্ক্রিপ্ট ডিসক্রিমিনেটেড ইউনিয়নস: টাইপ-সেফ স্টেট মেশিন তৈরি
সফটওয়্যার ডেভেলপমেন্টের জগতে, অ্যাপ্লিকেশনের স্টেট কার্যকরভাবে পরিচালনা করা অত্যন্ত গুরুত্বপূর্ণ। স্টেট মেশিনগুলো জটিল স্টেটফুল সিস্টেম মডেল করার জন্য একটি শক্তিশালী অ্যাবস্ট্র্যাকশন প্রদান করে, যা সিস্টেমের আচরণকে অনুমানযোগ্য করে তোলে এবং এর লজিক বোঝা সহজ করে। টাইপস্ক্রিপ্ট, তার শক্তিশালী টাইপ সিস্টেমের সাথে, ডিসক্রিমিনেটেড ইউনিয়নস (যা ট্যাগড ইউনিয়নস বা অ্যালজেব্রিক ডেটা টাইপস নামেও পরিচিত) ব্যবহার করে টাইপ-সেফ স্টেট মেশিন তৈরির একটি চমৎকার পদ্ধতি প্রদান করে।
ডিসক্রিমিনেটেড ইউনিয়নস কী?
একটি ডিসক্রিমিনেটেড ইউনিয়ন হলো এমন একটি টাইপ যা বিভিন্ন ধরনের মানের মধ্যে যেকোনো একটি হতে পারে। এই টাইপগুলোর প্রত্যেকটিকে ইউনিয়নের সদস্য বলা হয়, এবং তাদের সকলের একটি সাধারণ, স্বতন্ত্র বৈশিষ্ট্য থাকে, যাকে ডিসক্রিমিন্যান্ট বা ট্যাগ বলা হয়। এই ডিসক্রিমিন্যান্ট টাইপস্ক্রিপ্টকে সঠিকভাবে নির্ধারণ করতে সাহায্য করে যে ইউনিয়নের কোন সদস্যটি বর্তমানে সক্রিয় আছে, যার ফলে শক্তিশালী টাইপ চেকিং এবং অটো-কমপ্লিশন সম্ভব হয়।
এটিকে একটি ট্র্যাফিক লাইটের মতো ভাবুন। এটি তিনটি স্টেটের যেকোনো একটিতে থাকতে পারে: লাল, হলুদ বা সবুজ। এখানে 'রঙ' প্রপার্টিটি ডিসক্রিমিন্যান্ট হিসেবে কাজ করে, যা আমাদের ঠিক বলে দেয় লাইটটি কোন স্টেটে আছে।
স্টেট মেশিনের জন্য ডিসক্রিমিনেটেড ইউনিয়নস কেন ব্যবহার করবেন?
টাইপস্ক্রিপ্টে স্টেট মেশিন তৈরি করার সময় ডিসক্রিমিনেটেড ইউনিয়নস বেশ কিছু গুরুত্বপূর্ণ সুবিধা নিয়ে আসে:
- টাইপ সেফটি: কম্পাইলার যাচাই করতে পারে যে সমস্ত সম্ভাব্য স্টেট এবং ট্রানজিশন সঠিকভাবে পরিচালনা করা হয়েছে, যা অপ্রত্যাশিত স্টেট ট্রানজিশন সম্পর্কিত রানটাইম ত্রুটি প্রতিরোধ করে। এটি বিশেষত বড় এবং জটিল অ্যাপ্লিকেশনগুলোর জন্য খুব দরকারী।
- এক্সহস্টিভনেস চেকিং (Exhaustiveness Checking): টাইপস্ক্রিপ্ট নিশ্চিত করতে পারে যে আপনার কোড স্টেট মেশিনের সমস্ত সম্ভাব্য স্টেট পরিচালনা করছে। যদি কোনো কন্ডিশনাল স্টেটমেন্ট বা সুইচ কেসে কোনো স্টেট বাদ পড়ে যায়, তবে এটি আপনাকে কম্পাইল টাইমে সতর্ক করে দেবে। এটি অপ্রত্যাশিত আচরণ প্রতিরোধ করতে সাহায্য করে এবং আপনার কোডকে আরও শক্তিশালী করে তোলে।
- পাঠযোগ্যতা বৃদ্ধি: ডিসক্রিমিনেটেড ইউনিয়নস সিস্টেমের সম্ভাব্য স্টেটগুলোকে স্পষ্টভাবে সংজ্ঞায়িত করে, যার ফলে কোড বোঝা এবং রক্ষণাবেক্ষণ করা সহজ হয়। স্টেটের সুস্পষ্ট উপস্থাপনা কোডের স্বচ্ছতা বাড়ায়।
- উন্নত কোড কমপ্লিশন: টাইপস্ক্রিপ্টের ইন্টেলিসেন্স বর্তমান স্টেটের উপর ভিত্তি করে বুদ্ধিমান কোড কমপ্লিশনের পরামর্শ প্রদান করে, যা ত্রুটির সম্ভাবনা কমায় এবং ডেভেলপমেন্টের গতি বাড়ায়।
ডিসক্রিমিনেটেড ইউনিয়নস দিয়ে একটি স্টেট মেশিন সংজ্ঞায়িত করা
আসুন একটি ব্যবহারিক উদাহরণ দিয়ে দেখি কিভাবে ডিসক্রিমিনেটেড ইউনিয়নস ব্যবহার করে একটি স্টেট মেশিন সংজ্ঞায়িত করা যায়: একটি অর্ডার প্রসেসিং সিস্টেম। একটি অর্ডার নিম্নলিখিত স্টেটগুলোতে থাকতে পারে: Pending, Processing, Shipped, এবং Delivered।
ধাপ ১: স্টেট টাইপগুলো সংজ্ঞায়িত করুন
প্রথমে, আমরা প্রতিটি স্টেটের জন্য আলাদা টাইপ সংজ্ঞায়িত করব। প্রতিটি টাইপের একটি `type` প্রপার্টি থাকবে যা ডিসক্রিমিন্যান্ট হিসেবে কাজ করবে, এবং এর সাথে থাকবে সেই স্টেটের জন্য নির্দিষ্ট ডেটা।
interface Pending {
type: "pending";
orderId: string;
customerName: string;
items: string[];
}
interface Processing {
type: "processing";
orderId: string;
assignedAgent: string;
}
interface Shipped {
type: "shipped";
orderId: string;
trackingNumber: string;
}
interface Delivered {
type: "delivered";
orderId: string;
deliveryDate: Date;
}
ধাপ ২: ডিসক্রিমিনেটেড ইউনিয়ন টাইপ তৈরি করুন
এরপরে, আমরা `|` (ইউনিয়ন) অপারেটর ব্যবহার করে এই স্বতন্ত্র টাইপগুলোকে একত্রিত করে ডিসক্রিমিনেটেড ইউনিয়ন তৈরি করব।
type OrderState = Pending | Processing | Shipped | Delivered;
এখন, `OrderState` এমন একটি মানকে প্রতিনিধিত্ব করে যা `Pending`, `Processing`, `Shipped`, বা `Delivered` এর যেকোনো একটি হতে পারে। প্রতিটি স্টেটের মধ্যে থাকা `type` প্রপার্টিটি ডিসক্রিমিন্যান্ট হিসেবে কাজ করে, যা টাইপস্ক্রিপ্টকে তাদের মধ্যে পার্থক্য করতে সাহায্য করে।
স্টেট ট্রানজিশন পরিচালনা করা
এখন যেহেতু আমরা আমাদের স্টেট মেশিন সংজ্ঞায়িত করেছি, আমাদের স্টেটগুলোর মধ্যে ট্রানজিশনের জন্য একটি পদ্ধতি প্রয়োজন। আসুন একটি `processOrder` ফাংশন তৈরি করি যা বর্তমান স্টেট এবং একটি অ্যাকশন ইনপুট হিসেবে নেয় এবং নতুন স্টেট রিটার্ন করে।
interface Action {
type: string;
payload?: any;
}
function processOrder(state: OrderState, action: Action): OrderState {
switch (state.type) {
case "pending":
if (action.type === "startProcessing") {
return {
type: "processing",
orderId: state.orderId,
assignedAgent: action.payload.agentId,
};
}
return state; // কোনো স্টেট পরিবর্তন হয়নি
case "processing":
if (action.type === "shipOrder") {
return {
type: "shipped",
orderId: state.orderId,
trackingNumber: action.payload.trackingNumber,
};
}
return state; // কোনো স্টেট পরিবর্তন হয়নি
case "shipped":
if (action.type === "deliverOrder") {
return {
type: "delivered",
orderId: state.orderId,
deliveryDate: new Date(),
};
}
return state; // কোনো স্টেট পরিবর্তন হয়নি
case "delivered":
// অর্ডার ইতিমধ্যে ডেলিভার করা হয়েছে, আর কোনো অ্যাকশন নেই
return state;
default:
// এক্সহস্টিভনেস চেকিংয়ের কারণে এটি কখনও ঘটা উচিত নয়
return state; // অথবা একটি এরর থ্রো করুন
}
}
ব্যাখ্যা
- `processOrder` ফাংশনটি বর্তমান `OrderState` এবং একটি `Action` ইনপুট হিসেবে নেয়।
- এটি `state.type` ডিসক্রিমিন্যান্টের উপর ভিত্তি করে বর্তমান স্টেট নির্ধারণ করতে একটি `switch` স্টেটমেন্ট ব্যবহার করে।
- প্রতিটি `case` এর ভিতরে, এটি `action.type` পরীক্ষা করে দেখে যে কোনো বৈধ ট্রানজিশন ট্রিগার হয়েছে কিনা।
- যদি একটি বৈধ ট্রানজিশন পাওয়া যায়, তবে এটি উপযুক্ত `type` এবং ডেটা সহ একটি নতুন স্টেট অবজেক্ট রিটার্ন করে।
- যদি কোনো বৈধ ট্রানজিশন না পাওয়া যায়, তবে এটি বর্তমান স্টেট রিটার্ন করে (অথবা কাঙ্ক্ষিত আচরণের উপর নির্ভর করে একটি এরর থ্রো করে)।
- `default` কেসটি সম্পূর্ণতার জন্য অন্তর্ভুক্ত করা হয়েছে এবং টাইপস্ক্রিপ্টের এক্সহস্টিভনেস চেকিংয়ের কারণে এটি আদর্শগতভাবে কখনও পৌঁছানো উচিত নয়।
এক্সহস্টিভনেস চেকিংয়ের সুবিধা গ্রহণ
টাইপস্ক্রিপ্টের এক্সহস্টিভনেস চেকিং একটি শক্তিশালী বৈশিষ্ট্য যা নিশ্চিত করে যে আপনি আপনার স্টেট মেশিনের সমস্ত সম্ভাব্য স্টেট পরিচালনা করেছেন। যদি আপনি `OrderState` ইউনিয়নে একটি নতুন স্টেট যোগ করেন কিন্তু `processOrder` ফাংশন আপডেট করতে ভুলে যান, টাইপস্ক্রিপ্ট একটি এরর দেখাবে।
এক্সহস্টিভনেস চেকিং সক্রিয় করতে, আপনি `never` টাইপ ব্যবহার করতে পারেন। আপনার সুইচ স্টেটমেন্টের `default` কেসের ভিতরে, স্টেটটিকে `never` টাইপের একটি ভেরিয়েবলে অ্যাসাইন করুন।
function processOrder(state: OrderState, action: Action): OrderState {
switch (state.type) {
// ... (আগের কেসগুলো) ...
default:
const _exhaustiveCheck: never = state;
return _exhaustiveCheck; // অথবা একটি এরর থ্রো করুন
}
}
যদি `switch` স্টেটমেন্ট সমস্ত সম্ভাব্য `OrderState` মান পরিচালনা করে, তবে `_exhaustiveCheck` ভেরিয়েবলটি `never` টাইপের হবে এবং কোড কম্পাইল হবে। তবে, যদি আপনি `OrderState` ইউনিয়নে একটি নতুন স্টেট যোগ করেন এবং `switch` স্টেটমেন্টে সেটি পরিচালনা করতে ভুলে যান, `_exhaustiveCheck` ভেরিয়েবলটি একটি ভিন্ন টাইপের হবে, এবং টাইপস্ক্রিপ্ট একটি কম্পাইল-টাইম এরর দেবে, যা আপনাকে অনুপস্থিত কেসের বিষয়ে সতর্ক করবে।
ব্যবহারিক উদাহরণ এবং অ্যাপ্লিকেশন
ডিসক্রিমিনেটেড ইউনিয়নস সাধারণ অর্ডার প্রসেসিং সিস্টেমের বাইরেও বিভিন্ন ক্ষেত্রে প্রযোজ্য:
- UI স্টেট ম্যানেজমেন্ট: একটি UI কম্পোনেন্টের স্টেট মডেল করা (যেমন, লোডিং, সফল, ত্রুটি)।
- নেটওয়ার্ক রিকোয়েস্ট হ্যান্ডলিং: একটি নেটওয়ার্ক রিকোয়েস্টের বিভিন্ন পর্যায় উপস্থাপন করা (যেমন, প্রাথমিক, প্রগতিতে, সফল, ব্যর্থ)।
- ফর্ম ভ্যালিডেশন: ফর্ম ফিল্ড এবং সম্পূর্ণ ফর্মের বৈধতা ট্র্যাক করা।
- গেম ডেভেলপমেন্ট: একটি গেমের চরিত্র বা বস্তুর বিভিন্ন স্টেট সংজ্ঞায়িত করা।
- অথেন্টিকেশন ফ্লো: ব্যবহারকারীর প্রমাণীকরণ স্টেট পরিচালনা করা (যেমন, লগ ইন, লগ আউট, যাচাইকরণ বাকি)।
উদাহরণ: UI স্টেট ম্যানেজমেন্ট
আসুন একটি API থেকে ডেটা আনা একটি UI কম্পোনেন্টের স্টেট পরিচালনার একটি সহজ উদাহরণ বিবেচনা করি। আমরা নিম্নলিখিত স্টেটগুলো সংজ্ঞায়িত করতে পারি:
interface Initial {
type: "initial";
}
interface Loading {
type: "loading";
}
interface Success {
type: "success";
data: T;
}
interface Error {
type: "error";
message: string;
}
type UIState = Initial | Loading | Success | Error;
function renderUI(state: UIState): React.ReactNode {
switch (state.type) {
case "initial":
return ডেটা লোড করতে বোতামে ক্লিক করুন।
;
case "loading":
return লোড হচ্ছে...
;
case "success":
return {JSON.stringify(state.data, null, 2)}
;
case "error":
return ত্রুটি: {state.message}
;
default:
const _exhaustiveCheck: never = state;
return _exhaustiveCheck;
}
}
এই উদাহরণটি দেখায় যে কিভাবে ডিসক্রিমিনেটেড ইউনিয়নস একটি UI কম্পোনেন্টের বিভিন্ন স্টেট কার্যকরভাবে পরিচালনা করতে ব্যবহার করা যেতে পারে, যা নিশ্চিত করে যে UI বর্তমান স্টেটের উপর ভিত্তি করে সঠিকভাবে রেন্ডার হয়। `renderUI` ফাংশনটি প্রতিটি স্টেটকে যথাযথভাবে পরিচালনা করে, যা UI পরিচালনার একটি পরিষ্কার এবং টাইপ-সেফ উপায় প্রদান করে।
ডিসক্রিমিনেটেড ইউনিয়নস ব্যবহারের সেরা অনুশীলন
আপনার টাইপস্ক্রিপ্ট প্রোজেক্টে ডিসক্রিমিনেটেড ইউনিয়নস কার্যকরভাবে ব্যবহার করার জন্য, নিম্নলিখিত সেরা অনুশীলনগুলো বিবেচনা করুন:
- অর্থপূর্ণ ডিসক্রিমিন্যান্ট নাম বাছুন: এমন ডিসক্রিমিন্যান্ট নাম নির্বাচন করুন যা প্রপার্টির উদ্দেশ্য স্পষ্টভাবে নির্দেশ করে (যেমন, `type`, `state`, `status`)।
- স্টেট ডেটা সংক্ষিপ্ত রাখুন: প্রতিটি স্টেটে শুধুমাত্র সেই স্টেটের সাথে প্রাসঙ্গিক ডেটা থাকা উচিত। অপ্রয়োজনীয় ডেটা স্টেটে সংরক্ষণ করা থেকে বিরত থাকুন।
- এক্সহস্টিভনেস চেকিং ব্যবহার করুন: আপনি যে সমস্ত সম্ভাব্য স্টেট পরিচালনা করছেন তা নিশ্চিত করতে সর্বদা এক্সহস্টিভনেস চেকিং সক্রিয় করুন।
- স্টেট ম্যানেজমেন্ট লাইব্রেরি ব্যবহারের কথা ভাবুন: জটিল স্টেট মেশিনগুলোর জন্য, XState-এর মতো একটি বিশেষায়িত স্টেট ম্যানেজমেন্ট লাইব্রেরি ব্যবহার করার কথা বিবেচনা করুন, যা স্টেট চার্ট, হায়ারারকিক্যাল স্টেট এবং প্যারালাল স্টেটের মতো উন্নত বৈশিষ্ট্য সরবরাহ করে। তবে, সহজ পরিস্থিতির জন্য, ডিসক্রিমিনেটেড ইউনিয়নসই যথেষ্ট হতে পারে।
- আপনার স্টেট মেশিন ডকুমেন্ট করুন: রক্ষণাবেক্ষণ এবং সহযোগিতা উন্নত করতে আপনার স্টেট মেশিনের বিভিন্ন স্টেট, ট্রানজিশন এবং অ্যাকশনগুলো স্পষ্টভাবে ডকুমেন্ট করুন।
উন্নত কৌশল
কন্ডিশনাল টাইপস
কন্ডিশনাল টাইপসকে ডিসক্রিমিনেটেড ইউনিয়নসের সাথে একত্রিত করে আরও শক্তিশালী এবং নমনীয় স্টেট মেশিন তৈরি করা যেতে পারে। উদাহরণস্বরূপ, আপনি বর্তমান স্টেটের উপর ভিত্তি করে একটি ফাংশনের জন্য বিভিন্ন রিটার্ন টাইপ সংজ্ঞায়িত করতে কন্ডিশনাল টাইপস ব্যবহার করতে পারেন।
function getData(state: UIState): T | undefined {
if (state.type === "success") {
return state.data;
}
return undefined;
}
এই ফাংশনটি একটি সাধারণ `if` স্টেটমেন্ট ব্যবহার করে কিন্তু একটি নির্দিষ্ট টাইপ সর্বদা রিটার্ন করা নিশ্চিত করতে কন্ডিশনাল টাইপস ব্যবহার করে এটিকে আরও শক্তিশালী করা যেতে পারে।
ইউটিলিটি টাইপস
টাইপস্ক্রিপ্টের ইউটিলিটি টাইপস, যেমন `Extract` এবং `Omit`, ডিসক্রিমিনেটেড ইউনিয়নসের সাথে কাজ করার সময় সহায়ক হতে পারে। `Extract` আপনাকে একটি শর্তের উপর ভিত্তি করে একটি ইউনিয়ন টাইপ থেকে নির্দিষ্ট সদস্য নিষ্কাশন করতে দেয়, যখন `Omit` আপনাকে একটি টাইপ থেকে প্রপার্টি অপসারণ করতে দেয়।
// UIState ইউনিয়ন থেকে "success" স্টেটটি নিষ্কাশন করুন
type SuccessState = Extract, { type: "success" }>;
// Error ইন্টারফেস থেকে 'message' প্রপার্টিটি বাদ দিন
type ErrorWithoutMessage = Omit;
বিভিন্ন শিল্পে বাস্তব-বিশ্বের উদাহরণ
ডিসক্রিমিনেটেড ইউনিয়নসের শক্তি বিভিন্ন শিল্প এবং অ্যাপ্লিকেশন ডোমেইন জুড়ে বিস্তৃত:
- ই-কমার্স (গ্লোবাল): একটি গ্লোবাল ই-কমার্স প্ল্যাটফর্মে, অর্ডারের স্ট্যাটাসকে ডিসক্রিমিনেটেড ইউনিয়নস দিয়ে উপস্থাপন করা যেতে পারে, যা "PaymentPending", "Processing", "Shipped", "InTransit", "Delivered" এবং "Cancelled" এর মতো স্টেটগুলো পরিচালনা করে। এটি বিভিন্ন দেশের বিভিন্ন শিপিং লজিস্টিকসের মধ্যে সঠিক ট্র্যাকিং এবং যোগাযোগ নিশ্চিত করে।
- আর্থিক পরিষেবা (আন্তর্জাতিক ব্যাংকিং): "PendingAuthorization", "Authorized", "Processing", "Completed", "Failed" এর মতো লেনদেনের স্টেট পরিচালনা করা অত্যন্ত গুরুত্বপূর্ণ। ডিসক্রিমিনেটেড ইউনিয়নস এই স্টেটগুলো পরিচালনা করার একটি শক্তিশালী উপায় প্রদান করে, যা বিভিন্ন আন্তর্জাতিক ব্যাংকিং নিয়ম মেনে চলে।
- স্বাস্থ্যসেবা (দূরবর্তী রোগী পর্যবেক্ষণ): "Normal", "Warning", "Critical" এর মতো স্টেট ব্যবহার করে রোগীর স্বাস্থ্যের অবস্থা উপস্থাপন করা সময়মত হস্তক্ষেপ সক্ষম করে। বিশ্বব্যাপী বন্টিত স্বাস্থ্যসেবা সিস্টেমে, ডিসক্রিমিনেটেড ইউনিয়নস অবস্থান নির্বিশেষে ডেটার সামঞ্জস্যপূর্ণ ব্যাখ্যা নিশ্চিত করতে পারে।
- লজিস্টিকস (গ্লোবাল সাপ্লাই চেইন): আন্তর্জাতিক সীমানা জুড়ে চালানের অবস্থা ট্র্যাক করার জন্য জটিল ওয়ার্কফ্লো জড়িত। "CustomsClearance", "InTransit", "AtDistributionCenter", "Delivered" এর মতো স্টেটগুলো ডিসক্রিমিনেটেড ইউনিয়নস বাস্তবায়নের জন্য পুরোপুরি উপযুক্ত।
- শিক্ষা (অনলাইন লার্নিং প্ল্যাটফর্ম): "Enrolled", "InProgress", "Completed", "Dropped" এর মতো স্টেট দিয়ে কোর্সের তালিকাভুক্তির অবস্থা পরিচালনা করা একটি সুশৃঙ্খল শেখার অভিজ্ঞতা প্রদান করতে পারে, যা বিশ্বব্যাপী বিভিন্ন শিক্ষা ব্যবস্থার সাথে খাপ খাইয়ে নিতে পারে।
উপসংহার
টাইপস্ক্রিপ্ট ডিসক্রিমিনেটেড ইউনিয়নস স্টেট মেশিন তৈরির একটি শক্তিশালী এবং টাইপ-সেফ উপায় প্রদান করে। সম্ভাব্য স্টেট এবং ট্রানজিশনগুলো স্পষ্টভাবে সংজ্ঞায়িত করার মাধ্যমে, আপনি আরও শক্তিশালী, রক্ষণাবেক্ষণযোগ্য এবং বোধগম্য কোড তৈরি করতে পারেন। টাইপ সেফটি, এক্সহস্টিভনেস চেকিং এবং উন্নত কোড কমপ্লিশনের সমন্বয় ডিসক্রিমিনেটেড ইউনিয়নসকে যেকোনো টাইপস্ক্রিপ্ট ডেভেলপারের জন্য একটি অমূল্য হাতিয়ার করে তোলে যিনি জটিল স্টেট ম্যানেজমেন্ট নিয়ে কাজ করেন। আপনার পরবর্তী প্রোজেক্টে ডিসক্রিমিনেটেড ইউনিয়নস গ্রহণ করুন এবং টাইপ-সেফ স্টেট ম্যানেজমেন্টের সুবিধাগুলো firsthand অনুভব করুন। যেমনটি আমরা ই-কমার্স থেকে স্বাস্থ্যসেবা, এবং লজিস্টিকস থেকে শিক্ষা পর্যন্ত বিভিন্ন উদাহরণ দিয়ে দেখিয়েছি, ডিসক্রিমিনেটেড ইউনিয়নসের মাধ্যমে টাইপ-সেফ স্টেট ম্যানেজমেন্টের নীতিটি বিশ্বব্যাপী প্রযোজ্য।
আপনি একটি সাধারণ UI কম্পোনেন্ট বা একটি জটিল এন্টারপ্রাইজ অ্যাপ্লিকেশন তৈরি করছেন কিনা, ডিসক্রিমিনেটেড ইউনিয়নস আপনাকে আরও কার্যকরভাবে স্টেট পরিচালনা করতে এবং রানটাইম ত্রুটির ঝুঁকি কমাতে সাহায্য করতে পারে। সুতরাং, ডুব দিন এবং টাইপস্ক্রিপ্টের সাথে টাইপ-সেফ স্টেট মেশিনের জগতটি অন্বেষণ করুন!